package online.heycm.platform.redis;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Redis客户端
 *
 * @author heycm
 * @since 2023/11/11 16:15
 */
public interface RedisCache {

    /**
     * 删除指定键
     */
    boolean del(String key);

    /**
     * 删除指定键
     */
    boolean delNamespace(String namespace, String key);

    /**
     * 删除指定键
     */
    long del(String... keys);

    /**
     * 删除指定键
     */
    long delNamespace(String namespace, String... keys);

    /**
     * 设置指定键过期时间
     */
    boolean expire(String key, long millisecond);

    /**
     * 设置指定键过期时间
     */
    boolean expireNamespace(String namespace, String key, long millisecond);

    /**
     * 返回指定键过期时间
     */
    long getExpire(String key);

    /**
     * 返回指定键过期时间
     */
    long getExpireNamespace(String namespace, String key);

    /**
     * 查询指定键是否存在
     */
    boolean hasKey(String key);

    /**
     * 查询指定键是否存在
     */
    boolean hasKeyNamespace(String namespace, String key);

    /*
     ------------------------------ String ------------------------------
     */

    /**
     * String 设置指定键值
     */
    boolean set(String key, String value);

    /**
     * String 设置指定键值
     */
    boolean setNamespace(String namespace, String key, String value);

    /**
     * String 设置指定键值，并设置过期时间
     */
    boolean set(String key, String value, long millisecond);

    /**
     * String 设置指定键值，并设置过期时间
     */
    boolean setNamespace(String namespace, String key, String value, long millisecond);

    /**
     * String 如果键不存在，则设置键的值，如果键已经存在，则不进行任何操作 Set if Not eXists
     */
    boolean setNx(String key, String value, long millisecond);

    /**
     * String 如果键不存在，则设置键的值，如果键已经存在，则不进行任何操作 Set if Not eXists
     */
    boolean setNx(String namespace, String key, String value, long millisecond);

    /**
     * String 返回指定键值
     */
    String get(String key);

    /**
     * String 返回指定键值
     */
    String getNamespace(String namespace, String key);

    /**
     * String 指定键步长为1顺序递增
     */
    long incr(String key);

    /**
     * String 指定键步长为1顺序递增
     */
    long incrNamespace(String namespace, String key);

    /**
     * String 指定键指定步长顺序递增
     */
    long incr(String key, long delta);

    /**
     * String 指定键指定步长顺序递增
     */
    long incrNamespace(String namespace, String key, long delta);

    /**
     * String 指定键步长为1顺序递减
     */
    long decr(String key);

    /**
     * String 指定键步长为1顺序递减
     */
    long decrNamespace(String namespace, String key);

    /**
     * String 指定键指定步长顺序递减
     */
    long decr(String key, long delta);

    /**
     * String 指定键指定步长顺序递减
     */
    long decrNamespace(String namespace, String key, long delta);

    /*
     ------------------------------ Hash ------------------------------
     */

    /**
     * Hash 创建Hash表
     */
    <T> boolean hSetObject(String key, T value);

    /**
     * Hash 创建Hash表
     */
    <T> boolean hSetNamespaceObject(String namespace, String key, T value);

    /**
     * Hash 创建Hash表，并设置Hash表过期时间
     */
    <T> boolean hSetObject(String key, T value, long millisecond);

    /**
     * Hash 创建Hash表，并设置Hash表过期时间
     */
    <T> boolean hSetNamespaceObject(String namespace, String key, T value, long millisecond);

    /**
     * Hash 创建Hash表
     */
    boolean hSet(String key, Map<String, Object> value);

    /**
     * Hash 创建Hash表
     */
    boolean hSetNamespace(String namespace, String key, Map<String, Object> value);

    /**
     * Hash 创建Hash表，并设置Hash表过期时间
     */
    boolean hSet(String key, Map<String, Object> value, long millisecond);

    /**
     * Hash 创建Hash表，并设置Hash表过期时间
     */
    boolean hSetNamespace(String namespace, String key, Map<String, Object> value, long millisecond);

    /**
     * Hash 向Hash表添加指定键值
     */
    boolean hSet(String key, String item, Object value);

    /**
     * Hash 向Hash表添加指定键值
     */
    boolean hSetNamespace(String namespace, String key, String item, Object value);

    /**
     * Hash 向Hash表添加指定键值，并设置Hash表过期时间
     */
    boolean hSet(String key, String item, Object value, long millisecond);

    /**
     * Hash 向Hash表添加指定键值，并设置Hash表过期时间
     */
    boolean hSetNamespace(String namespace, String key, String item, Object value, long millisecond);

    /**
     * Hash 返回Hash表
     */
    Map<String, Object> hGet(String key);

    /**
     * Hash 返回Hash表
     */
    Map<String, Object> hGetNamespace(String namespace, String key);

    /**
     * Hash 返回Hash表，并解析成指定类对象
     */
    <T> T hGet(String key, Class<T> clazz);

    /**
     * Hash 返回Hash表，并解析成指定类对象
     */
    <T> T hGetNamespace(String namespace, String key, Class<T> clazz);

    /**
     * Hash 返回指定键值
     */
    Object hGet(String key, String item);

    /**
     * Hash 返回指定键值
     */
    Object hGetNamespace(String namespace, String key, String item);

    /**
     * Hash 删除指定键
     */
    long hDel(String key, String item);

    /**
     * Hash 删除指定键
     */
    long hDelNamespace(String namespace, String key, String item);

    /**
     * Hash 删除指定键
     */
    long hDel(String key, String... items);

    /**
     * Hash 删除指定键
     */
    long hDelNamespace(String namespace, String key, String... items);

    /**
     * Hash 指定键步长为1顺序递增
     */
    long hIncr(String key, String item);

    /**
     * Hash 指定键步长为1顺序递增
     */
    long hIncrNamespace(String namespace, String key, String item);

    /**
     * Hash 指定键指定步长顺序递增
     */
    long hIncr(String key, String item, long delta);

    /**
     * Hash 指定键指定步长顺序递增
     */
    long hIncrNamespace(String namespace, String key, String item, long delta);

    /**
     * Hash 指定键步长为1顺序递减
     */
    long hDecr(String key, String item);

    /**
     * Hash 指定键步长为1顺序递减
     */
    long hDecrNamespace(String namespace, String key, String item);

    /**
     * Hash 指定键指定步长顺序递减
     */
    long hDecr(String key, String item, long delta);

    /**
     * Hash 指定键指定步长顺序递减
     */
    long hDecrNamespace(String namespace, String key, String item, long delta);

    /**
     * Hash 查询指定键是否存在
     */
    boolean hHasItem(String key, String item);

    /**
     * Hash 查询指定键是否存在
     */
    boolean hHasItemNamespace(String namespace, String key, String item);

    /**
     * Hash 返回Hash表所有键
     */
    Set<String> hItems(String key);

    /**
     * Hash 返回Hash表所有键
     */
    Set<String> hItemsNamespace(String namespace, String key);

    /**
     * Hash 返回Hash表所有值
     */
    List<Object> hValues(String key);

    /**
     * Hash 返回Hash表所有值
     */
    List<Object> hValuesNamespace(String namespace, String key);

    /*
     ------------------------------ Set ------------------------------
     */

    /**
     * Set 向集合中添加元素
     */
    long sSet(String key, Object... values);

    /**
     * Set 向集合中添加元素
     */
    long sSetNamespace(String namespace, String key, Object... values);

    /**
     * Set 向集合中添加元素，并设置集合过期时间
     */
    long sSet(String key, long millisecond, Object... values);

    /**
     * Set 向集合中添加元素，并设置集合过期时间
     */
    long sSetNamespace(String namespace, String key, long millisecond, Object... values);

    /**
     * Set 向集合中添加元素
     */
    long sSet(String key, Set<Object> value);

    /**
     * Set 向集合中添加元素
     */
    long sSetNamespace(String namespace, String key, Set<Object> value);

    /**
     * Set 向集合中添加元素，并设置集合过期时间
     */
    long sSet(String key, Set<Object> value, long millisecond);

    /**
     * Set 向集合中添加元素，并设置集合过期时间
     */
    long sSetNamespace(String namespace, String key, Set<Object> value, long millisecond);

    /**
     * Set 返回所有元素
     */
    Set<Object> sGet(String key);

    /**
     * Set 返回所有元素
     */
    Set<Object> sGetNamespace(String namespace, String key);

    /**
     * Set 查询指定元素是否存在
     */
    boolean sHasValue(String key, Object value);

    /**
     * Set 查询指定元素是否存在
     */
    boolean sHasValueNamespace(String namespace, String key, Object value);

    /**
     * Set 删除集合指定元素
     */
    long sDel(String key, Object value);

    /**
     * Set 删除集合指定元素
     */
    long sDelNamespace(String namespace, String key, Object value);

    /**
     * Set 删除集合指定元素
     */
    long sDel(String key, Object... values);

    /**
     * Set 删除集合指定元素
     */
    long sDelNamespace(String namespace, String key, Object... values);

    /**
     * Set 返回集合长度
     */
    long sSize(String key);

    /**
     * Set 返回集合长度
     */
    long sSizeNamespace(String namespace, String key);

    /*
     ------------------------------ List ------------------------------
     */

    /**
     * List 从集合尾部添加元素
     */
    long lRightPush(String key, Object... values);

    /**
     * List 从集合尾部添加元素
     */
    long lRightPushNamespace(String namespace, String key, Object... values);

    /**
     * List 从集合尾部添加元素，并设置过期时间
     */
    long lRightPush(String key, long millisecond, Object... values);

    /**
     * List 从集合尾部添加元素，并设置过期时间
     */
    long lRightPushNamespace(String namespace, String key, long millisecond, Object... values);

    /**
     * List 从集合尾部添加元素
     */
    long lRightPush(String key, List<Object> value);

    /**
     * List 从集合尾部添加元素
     */
    long lRightPushNamespace(String namespace, String key, List<Object> value);

    /**
     * List 从集合尾部添加元素，并设置过期时间
     */
    long lRightPush(String key, long millisecond, List<Object> value);

    /**
     * List 从集合尾部添加元素，并设置过期时间
     */
    long lRightPushNamespace(String namespace, String key, long millisecond, List<Object> value);

    /**
     * List 从集合头部添加元素
     */
    long lLeftPush(String key, Object... values);

    /**
     * List 从集合头部添加元素
     */
    long lLeftPushNamespace(String namespace, String key, Object... values);

    /**
     * List 从集合头部添加元素，并设置过期时间
     */
    long lLeftPush(String key, long millisecond, Object... values);

    /**
     * List 从集合头部添加元素，并设置过期时间
     */
    long lLeftPushNamespace(String namespace, String key, long millisecond, Object... values);

    /**
     * List 从集合头部添加元素
     */
    long lLeftPush(String key, List<Object> value);

    /**
     * List 从集合头部添加元素
     */
    long lLeftPushNamespace(String namespace, String key, List<Object> value);

    /**
     * List 从集合头部添加元素，并设置集合过期时间
     */
    long lLeftPush(String key, long millisecond, List<Object> value);

    /**
     * List 从集合头部添加元素，并设置集合过期时间
     */
    long lLeftPushNamespace(String namespace, String key, long millisecond, List<Object> value);

    /**
     * List 返回所有元素
     */
    List<Object> lGet(String key);

    /**
     * List 返回所有元素
     */
    List<Object> lGetNamespace(String namespace, String key);

    /**
     * List 返回指定索引区间的元素
     */
    List<Object> lRange(String key, long start, long end);

    /**
     * List 返回指定索引区间的元素
     */
    List<Object> lRangeNamespace(String namespace, String key, long start, long end);

    /**
     * List 返回指定索引的元素
     */
    Object lIndex(String key, long index);

    /**
     * List 返回指定索引的元素
     */
    Object lIndexNamespace(String namespace, String key, long index);

    /**
     * List 弹出集合头部第一个元素
     */
    Object lLeftPop(String key);

    /**
     * List 弹出集合头部第一个元素
     */
    Object lLeftPopNamespace(String namespace, String key);

    /**
     * List 弹出集合尾部第一个元素
     */
    Object lRightPop(String key);

    /**
     * List 弹出集合尾部第一个元素
     */
    Object lRightPopNamespace(String namespace, String key);

    /**
     * List 返回集合长度
     */
    long lSize(String key);

    /**
     * List 返回集合长度
     */
    long lSizeNamespace(String namespace, String key);

    /**
     * List 修改指定索引的元素
     */
    boolean lSet(String key, long index, Object value);

    /**
     * List 修改指定索引的元素
     */
    boolean lSetNamespace(String namespace, String key, long index, Object value);

    /**
     * List 删除指定值的所有元素
     */
    long lDel(String key, Object value);

    /**
     * List 删除指定值的所有元素
     */
    long lDelNamespace(String namespace, String key, Object value);

    /**
     * List 删除指定个数且指定值的元素
     */
    long lDel(String key, long number, Object value);

    /**
     * List 删除指定个数且指定值的元素
     */
    long lDelNamespace(String namespace, String key, long number, Object value);

    /*
     ------------------------------ ZSet ------------------------------
     */

    /**
     * ZSet 向集合中插入元素，并设置分数
     */
    boolean zSet(String key, Object value, long score);

    /**
     * ZSet 向集合中插入元素，并设置分数
     */
    boolean zSetNamespace(String namespace, String key, Object value, long score);

    /**
     * ZSet 返回所有元素
     */
    Set<Object> zGet(String key);

    /**
     * ZSet 返回所有元素
     */
    Set<Object> zGetNamespace(String namespace, String key);

    /**
     * ZSet 返回指定索引区间元素
     */
    Set<Object> zRange(String key, long start, long end);

    /**
     * ZSet 返回指定索引区间元素
     */
    Set<Object> zRangeNamespace(String namespace, String key, long start, long end);

    /**
     * ZSet 返回指定元素的分数
     */
    long zScore(String key, Object value);

    /**
     * ZSet 返回指定元素的分数
     */
    long zScoreNamespace(String namespace, String key, Object value);

    /**
     * ZSet 返回集合长度
     */
    long zSize(String key);

    /**
     * ZSet 返回集合长度
     */
    long zSizeNamespace(String namespace, String key);

    /**
     * ZSet 返回指定分数区间内元素个数
     */
    long zCount(String key, long minScore, long maxScore);

    /**
     * ZSet 返回指定分数区间内元素个数
     */
    long zCountNamespace(String namespace, String key, long minScore, long maxScore);

    /**
     * ZSet 正序返回指定分数区间内元素
     */
    Set<Object> zRangeByScore(String key, long minScore, long maxScore);

    /**
     * ZSet 正序返回指定分数区间内元素
     */
    Set<Object> zRangeByScoreNamespace(String namespace, String key, long minScore, long maxScore);

    /**
     * ZSet 倒序返回指定分数区间内元素
     */
    Set<Object> zReverseRangeByScore(String key, long minScore, long maxScore);

    /**
     * ZSet 倒序返回指定分数区间内元素
     */
    Set<Object> zReverseRangeByScoreNamespace(String namespace, String key, long minScore, long maxScore);

    /**
     * ZSet 返回指定元素正序排名
     */
    long zRank(String key, Object value);

    /**
     * ZSet 返回指定元素正序排名
     */
    long zRankNamespace(String namespace, String key, Object value);

    /**
     * ZSet 返回指定元素倒序排名
     */
    long zReverseRank(String key, Object value);

    /**
     * ZSet 返回指定元素倒序排名
     */
    long zReverseRankNamespace(String namespace, String key, Object value);

    /**
     * ZSet 删除指定元素
     */
    long zDel(String key, Object... values);

    /**
     * ZSet 删除指定元素
     */
    long zDelNamespace(String namespace, String key, Object... values);

    /**
     * ZSet 删除指定索引区间元素
     */
    long zDelRange(String key, long start, long end);

    /**
     * ZSet 删除指定索引区间元素
     */
    long zDelRangeNamespace(String namespace, String key, long start, long end);

    /**
     * ZSet 删除指定分数区间元素
     */
    long zDelScore(String key, long minScore, long maxScore);

    /**
     * ZSet 删除指定分数区间元素
     */
    long zDelScoreNamespace(String namespace, String key, long minScore, long maxScore);

    /**
     * ZSet 为指定元素增加分数
     */
    long zIncrScore(String key, Object value, long score);

    /**
     * ZSet 为指定元素增加分数
     */
    long zIncrScoreNamespace(String namespace, String key, Object value, long score);

}
